<template>
  <div class="wraps">


    <div ref="bar" class="bar"></div>
  </div>
</template>
<script setup lang="ts">
import {ref,onMounted} from 'vue';

let speed=ref<number>(1)
let bar=ref<HTMLDivElement>()
let timmer=ref<number>(0)
const startLoding=()=>{
    let dom= bar.value as HTMLElement
    speed.value=1
//     计时器一直是javascrit动画的核心技术。而编写动画循环的关键是要知道延迟时间多长合适。一方面，循环间隔必须足够短，这样才能让不同的动画效果显得平滑流畅，另一方面，循环间隔还要足够长，这样才能确保浏览器有能力渲染产生的变化
// 大多数电脑显示器的刷新频率是60H2，大概相当于每秒钟重绘60次。大多数浏览器都会对重绘操作加以限制，不超过显示器的重绘频率，因为即使超过那个频率用户体验也不会有提升。因此，最平滑动画的最佳循环间隔是1000ms/60，约等于16.6ms
// 而setTimeout和setInterval的问题是，它们都不精确。它们的内在运行机制决定了时间间隔参数实际上只是指定了把动画代码添加至浏览器U线程队列中以等待执行的时间。如果队列前面已经加入了其他任务，那动画代码就要等前面的任务完成后再执行
// requestAnimationFrame采用系统时间间隔，保持最佳绘制效率，不会因为间隔时间过短，造成过度绘制，增加开销，也不会因为隔时间太长，使用动画卡顿不流畅，让各种网页动画效果能够有一个统一的刷新机制，从而节省系统资源，提高系统性能，改善视觉效果
 timmer.value=   window.requestAnimationFrame(function fn() {
        dom.style.height='2px'
        if(speed.value<90){
            speed.value++ 
            dom.style.width=speed.value+'%'
            timmer.value=  window.requestAnimationFrame(fn)
        }else{
           speed.value=1
           window.cancelAnimationFrame(timmer.value)
        }
    });
}
const endLoding=()=>{
    let dom= bar.value as HTMLElement
    window.requestAnimationFrame(()=>{
        speed.value=100
        dom.style.width=speed.value+'%'
    })
    setTimeout(()=>{
      dom.style.height='0px'
       
    },1000)

    
   
}
defineExpose({
    startLoding,
    endLoding
})
onMounted(()=>{
    startLoding(),
    endLoding()
})
</script>
<style scoped lang="scss">
.wraps {
  position: fixed;
  top: 0;
  width: 100%;
  height: 2px;
  .bar {
    width: 0;
    height: inherit;
    background-color: greenyellow;
  }
}
</style>
